﻿
//using System;
//using System.Collections.Generic;
//using System.Threading.Tasks;
//using System.IO;
//using Microsoft.Data.Sqlite;

//namespace ConsoleDBTest.SQLite;


//public class DatabaseRetryManager : IDisposable
//{
//    private readonly string _connectionString;
//    private const int MaxRetries = 3;
//    private const int RetryDelayMs = 1000;

//    public DatabaseRetryManager(string dbPath)
//    {
//        var builder = new SqliteConnectionStringBuilder
//        {
//            DataSource = dbPath,
//            Version = 3,
//            DefaultTimeout = 30,
//            BusyTimeout = 5000,
//            JournalMode = SQLiteJournalModeEnum.Wal,
//            Pooling = true
//        };
//        _connectionString = builder.ConnectionString;

//        InitializeDatabase(dbPath);
//    }

//    private void InitializeDatabase(string dbPath)
//    {
//        if (!File.Exists(dbPath))
//        {
//            SQLiteConnection.CreateFile(dbPath);
//        }

//        using var connection = new SQLiteConnection(_connectionString);
//        connection.Open();
//        using var command = connection.CreateCommand();

//        // 创建示例表  
//        command.CommandText = @"  
//            CREATE TABLE IF NOT EXISTS Users (  
//                Id INTEGER PRIMARY KEY AUTOINCREMENT,  
//                Name TEXT NOT NULL,  
//                Email TEXT UNIQUE,  
//                CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP  
//            );  
            
//            CREATE TABLE IF NOT EXISTS Logs (  
//                Id INTEGER PRIMARY KEY AUTOINCREMENT,  
//                Message TEXT NOT NULL,  
//                LogLevel TEXT NOT NULL,  
//                Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP  
//            );";
//        command.ExecuteNonQuery();
//    }

//    // 基础重试方法  
//    public async Task ExecuteWithRetryAsync(Func<SQLiteConnection, Task> action)
//    {
//        for (int i = 0; i < MaxRetries; i++)
//        {
//            try
//            {
//                using (var connection = new SQLiteConnection(_connectionString))
//                {
//                    await connection.OpenAsync();
//                    await action(connection);
//                    return;
//                }
//            }
//            catch (SQLiteException ex) when (IsTransientError(ex))
//            {
//                if (i == MaxRetries - 1)
//                    throw;

//                await LogRetryAttemptAsync(ex, i + 1);
//                await Task.Delay(RetryDelayMs * (i + 1));
//            }
//        }
//    }

//    // 带返回值的重试方法  
//    public async Task<T> ExecuteWithRetryAsync<T>(Func<SQLiteConnection, Task<T>> action)
//    {
//        for (int i = 0; i < MaxRetries; i++)
//        {
//            try
//            {
//                using (var connection = new SQLiteConnection(_connectionString))
//                {
//                    await connection.OpenAsync();
//                    return await action(connection);
//                }
//            }
//            catch (SQLiteException ex) when (IsTransientError(ex))
//            {
//                if (i == MaxRetries - 1)
//                    throw;

//                await LogRetryAttemptAsync(ex, i + 1);
//                await Task.Delay(RetryDelayMs * (i + 1));
//            }
//        }

//        throw new Exception("重试次数已达上限");
//    }

//    private bool IsTransientError(SQLiteException ex)
//    {
//        return ex.ResultCode == SQLiteErrorCode.Busy ||
//               ex.ResultCode == SQLiteErrorCode.Locked;
//    }

//    private async Task LogRetryAttemptAsync(SQLiteException ex, int attempt)
//    {
//        var logMessage = $"重试尝试 {attempt}/{MaxRetries}. 错误: {ex.Message}";
//        await ExecuteWithoutRetryAsync(async conn =>
//        {
//            using var cmd = conn.CreateCommand();
//            cmd.CommandText = "INSERT INTO Logs (Message, LogLevel) VALUES (@message, @level)";
//            cmd.Parameters.AddWithValue("@message", logMessage);
//            cmd.Parameters.AddWithValue("@level", "Warning");
//            await cmd.ExecuteNonQueryAsync();
//        });
//    }

//    // 不带重试的执行方法（用于内部日志等操作）  
//    private async Task ExecuteWithoutRetryAsync(Func<SQLiteConnection, Task> action)
//    {
//        using var connection = new SQLiteConnection(_connectionString);
//        await connection.OpenAsync();
//        await action(connection);
//    }

//    // 实用方法：添加用户  
//    public async Task AddUserAsync(string name, string email)
//    {
//        await ExecuteWithRetryAsync(async connection =>
//        {
//            using var command = connection.CreateCommand();
//            command.CommandText = "INSERT INTO Users (Name, Email) VALUES (@name, @email)";
//            command.Parameters.AddWithValue("@name", name);
//            command.Parameters.AddWithValue("@email", email);
//            await command.ExecuteNonQueryAsync();
//        });
//    }

//    // 实用方法：获取用户  
//    public async Task<List<UserModel>> GetUsersAsync()
//    {
//        return await ExecuteWithRetryAsync(async connection =>
//        {
//            var users = new List<UserModel>();
//            using var command = connection.CreateCommand();
//            command.CommandText = "SELECT Id, Name, Email, CreatedAt FROM Users";

//            using var reader = await command.ExecuteReaderAsync();
//            while (await reader.ReadAsync())
//            {
//                users.Add(new UserModel
//                {
//                    Id = reader.GetInt32(0),
//                    Name = reader.GetString(1),
//                    Email = reader.GetString(2),
//                    CreatedAt = reader.GetDateTime(3)
//                });
//            }

//            return users;
//        });
//    }

//    public void Dispose()
//    {
//        // 清理资源  
//        GC.SuppressFinalize(this);
//    }
//}

//public class UserModel
//{
//    public int Id { get; set; }
//    public string Name { get; set; }
//    public string Email { get; set; }
//    public DateTime CreatedAt { get; set; }
//}
